{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sko.GA import GA\n",
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 造数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-1.2        -1.11724138 -1.03448276 -0.95172414 -0.86896552 -0.7862069\n",
      " -0.70344828 -0.62068966 -0.53793103 -0.45517241 -0.37241379 -0.28965517\n",
      " -0.20689655 -0.12413793 -0.04137931  0.04137931  0.12413793  0.20689655\n",
      "  0.28965517  0.37241379  0.45517241  0.53793103  0.62068966  0.70344828\n",
      "  0.7862069   0.86896552  0.95172414  1.03448276  1.11724138  1.2       ] (30,)\n"
     ]
    }
   ],
   "source": [
    "#先随机造一些数据\n",
    "# 生成数据\n",
    "x_true = np.linspace(-1.2, 1.2, 30)\n",
    "print(x_true,x_true.shape)#生成-1.2到1.2之间30个数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-0.39613017 -0.12489129  0.19888869  0.1771023   0.51470752  0.45153141\n",
      "  0.51007792  0.50484856  0.69291868  0.53881472  0.66659999  0.37645018\n",
      "  0.49267969  0.21235969  0.15614019 -0.0112683  -0.05266757 -0.16741934\n",
      "  0.02096095 -0.16147642 -0.26459904 -0.22957069 -0.03454208 -0.09802607\n",
      " -0.10170629  0.15580735  0.16283154  0.10921821  0.29390037  0.77608466] (30,)\n"
     ]
    }
   ],
   "source": [
    "# 3阶的y\n",
    "y_true = x_true ** 3 - x_true + 0.4 * np.random.rand(30)#y=x^3-x+0.4*随机值\n",
    "print(y_true,y_true.shape)#根据这个"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化\n",
    "plt.plot(x_true, y_true, 'o')\n",
    "plt.show()#这个生成的x和y "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 运用遗传算法求解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "#下面开始用遗传算法来模拟\n",
    "# 计算预测结果\n",
    "def f_fun(x, a, b, c, d):\n",
    "    return a * x ** 3 + b * x ** 2 + c * x + d#a*x^3+b*x^2+c*x+d 用这样一个函数来去拟合 a b c d 是我们要模拟出来的值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算loss\n",
    "def obj_fun(p):\n",
    "    a, b, c, d = p\n",
    "    # 计算残差 loss  真实值和预测值之间的loss\n",
    "    loss = np.square(f_fun(x_true, a, b, c, d) - y_true).sum()\n",
    "    return loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "best_x: [ 0.97985814  0.00964841 -0.98024611  0.17401025] \n",
      " best_y: [0.31834302]\n"
     ]
    }
   ],
   "source": [
    "# 使用 scikit-opt 做最优化\n",
    "#这里有4个参数  func=obj_fun表示要达到的目的 优化它  越小越好   n_dim=4表示上面abcd我们要训练出来的参数\n",
    "#size_pop=100表示生物的种群是100个 100个这样的生物  max_iter表示500迭代   lb和ub表示参数的上下界  就是abcd的范围 要是不设置的话 范围太大了\n",
    "ga = GA(func=obj_fun, n_dim=4, size_pop=100, max_iter=500, lb=[-2] * 4, ub=[2] * 4)\n",
    "best_params, loss = ga.run()\n",
    "print('best_x:', best_params, '\\n', 'best_y:', loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出拟合效果图\n",
    "# 得到预测值\n",
    "y_predict = f_fun(x_true, *best_params)\n",
    "fig, ax = plt.subplots()\n",
    "ax.plot(x_true, y_true, 'o')\n",
    "ax.plot(x_true, y_predict, '-')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
